package com.school.information.core.security.handler;

import com.school.information.enums.BaseEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class EnumTypeExchangeMybatisHandler<E extends Enum<E> & BaseEnum> extends BaseTypeHandler<E> {

    private Class<E> type;

    public EnumTypeExchangeMybatisHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        this.type = type;
    }

    /*
     * 用于定义通过字段名称获取字段数据时，如何把数据库类型转换为对应的 Java 类型
     */
    @Override
    public E getNullableResult(ResultSet arg0, String arg1) throws SQLException {
        int code = arg0.getInt(arg1);
        return arg0.wasNull() ? null : BaseEnum.codeOf(this.type, code);
    }

    /*
     * 用于定义通过字段索引获取字段数据时，如何把数据库类型转换为对应的 Java 类型
     */
    @Override
    public E getNullableResult(ResultSet arg0, int arg1) throws SQLException {
        int code = arg0.getInt(arg1);
        return arg0.wasNull() ? null : BaseEnum.codeOf(this.type, code);
    }

    /*
     * 用定义调用存储过程后，如何把数据库类型转换为对应的 Java 类型
     */
    @Override
    public E getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
        int code = arg0.getInt(arg1);
        return arg0.wasNull() ? null : BaseEnum.codeOf(this.type, code);
    }

    /*
     * 用于定义设置参数时，该如何把 Java 类型的参数转换为对应的数据库类型
     */
    @Override
    public void setNonNullParameter(PreparedStatement arg0, int arg1, E arg2, JdbcType arg3) throws SQLException {
        arg0.setInt(arg1, arg2.getCode());
    }

}
